import { _decorator, Component, Node, Sprite } from 'cc';
import { EnEvent } from './const/EnEvent';
import { EnResfUrl } from './const/EnResUrl';
import { GEvent } from './event/GEvent';
import { Handler } from './event/Handler';
import { ResourceMgr } from './ResourceMgr';
import { UISystem } from './ui/UISystem';
const { ccclass, property } = _decorator;

export class GameAPI {

	/**
 * 移除全局事件
 * @param type 事件类型
 * @param listener 事件侦听函数
 * @param caller 事件侦听函数的执行域。
 */
	 static RemoveGEvent(type: EnEvent, listener: Function, caller: any) {
		GEvent.instance.remove(type, caller, listener);
	}

	static OffAll(type = null)
	{
		GEvent.instance.offAll(type);
	}

	/**
 * 注册全局事件
 * @param type 事件类型
 * @param listener 事件侦听函数
 * @param caller 事件侦听函数的执行域。
 * @param args （可选）事件侦听函数的回调参数。
 */
	static RegGEvent(type: EnEvent, listener: Function, caller: any, args?: any[]) {
		GEvent.instance.on(type, caller, listener, args);
	}

	/**
	 * 注册全局事件,使用 EventDispatcher 对象注册指定类型的事件侦听器对象，以使侦听器能够接收事件通知，此侦听事件响应一次后自动移除。
	 * @param type 事件类型
	 * @param listener 事件侦听函数
	 * @param caller 事件侦听函数的执行域。
	 * @param args （可选）事件侦听函数的回调参数。
	 */
	static RegGEventOnce(type: EnEvent, listener: Function, caller: any, args?: any[]) {
		GEvent.instance.once(type, caller, listener, args);
	}

	/**
 * 派发事件。
 * @param type 事件类型
 * @param data （可选）回调数据。<b>注意：</b>如果是需要传递多个参数 p1,p2,p3,...可以使用数组结构如：[p1,p2,p3,...] ；如果需要回调单个参数 p ，且 p 是一个数组，则需要使用结构如：[p]，其他的单个参数 p ，可以直接传入参数 p。
 */
	static FireGEvent(type: EnEvent, data?: any) {
		GEvent.instance.event(type, data);
	}


	/**
 * 打开UI面板
 * @param type UI类型
 * @param args 参数列表
 * @param isCtr 是否启用UI栈管理，默认不启用
 */
	static OpenPanel(type: string, completeCallback:Handler = null, args?: any[], isCtr: boolean = false) {
		UISystem.instance.ShowPanel(type, completeCallback, args, isCtr);
	}

	static OpenBottomPanel(type: string, completeCallback:Handler = null, args?: any[])
	{
		UISystem.instance.ShowBottomPanel(type, completeCallback, args);
	}

	static IsShow(type: string){
		return UISystem.instance.IsShow(type);
	}

	/**
 * 关闭UI窗口统一接口
 * @param type 如果没有指定UI，就直接让UI栈关闭栈最顶层UI
 *              如果指定了UI，先判断UI是否启动了栈管理，
 *                           如果启动了，弹出并关闭UI栈顶之上所有UI，再弹出并关闭当前指定的UI
 *                           如果没有启动，直接ui系统中关闭指定UI。
 */
	static ClosePanel(type?: string) {
		UISystem.instance.DestroyPanel(type);
	}

	static CloseAllPanel()
	{
		UISystem.instance.CloseAllPanel();
	}

	/**
	 * 移除caller为target的所有事件监听
	 * @param caller caller对象
	 */
	static OffAllCaller(caller: any) {
		return GEvent.instance.offAllCaller(caller);
	}

	/**
* 加载角色图片
* @param name 道具名字
* @param spriteNode 节点
*/
	static LoadRoleImage(name: string, sprite: Sprite, complete?: Handler) {
		ResourceMgr.instance.LoadTextureBundle(EnResfUrl.role, name, sprite, complete);
	}

	static LoadSpriteImage(name: string, sprite: Sprite, complete?: Handler) {
		ResourceMgr.instance.LoadTextureBundle(EnResfUrl.Sprite, name, sprite, complete);
	}

	static LoadSpriteBattleImage(name: string, sprite: Sprite, complete?: Handler) {
		ResourceMgr.instance.LoadTextureBundle(EnResfUrl.battle, name, sprite, complete);
	}

	/**
 * 加载道具图片
 * @param name 道具名字
 * @param spriteNode 节点
 */
	static LoadGoodsImage(name: string, sprite: Sprite, complete?: Handler) {
		ResourceMgr.instance.LoadTextureBundle(EnResfUrl.icon, name, sprite, complete);
	}

	/**
	 * 加载道具图片
	 * @param name 道具名字
	 * @param spriteNode 节点
	 */
	static LoadPrefabBundle(name: string, complete?: Handler) {
		ResourceMgr.instance.LoadPrefabBundle("Prefer", name, complete);
	}



}


